const fs = require("fs")
const path = require('path')

// 记录数据文件目录
const dataDir = './node_modules/language-packer/src/data/'

/**
 * 写入数据
 * @param {string} outDir 文件输出目录
 * @param {string} file 文件名
 * @param {string} key 索引
 * @param {string} val 值
 */
function writeData(outDir, file, key, val) {
    const dir = path.resolve(outDir)
    const filePath = `${dir}/${file}`
    let data = {}

    // 文件目录不存在，创建目录
    try {
        fs.accessSync(dir)
    } catch (err) {
        fs.mkdirSync(dir)
    }

    // 文件是否存在
    const exists = fs.existsSync(filePath)

    // 读取数据
    if (exists) {
        const fileData = fs.readFileSync(filePath, { encoding: 'utf8' })
        if (fileData) data = JSON.parse(fileData)
    }

    // 写入数据
    data[key] = val
    data = JSON.stringify(data)
    fs.writeFileSync(filePath, data)

    // 新创建的文件，更新一下数据加载文件
    if (!exists) createDataFile(outDir)
}

/**
 * 读取目录所以文件
 * @param {string} outDir 文件输出目录
 */
function readDir(outDir) {
    const dir = path.resolve(outDir)

    // 文件目录不存在，创建目录
    try {
        fs.accessSync(dir)
        const files = fs.readdirSync(dir)
        return files
    } catch (err) {
        fs.mkdirSync(dir)
        return []
    }
}


/**
 * 生成、更新数据导入文件
 * @param {string} outDir 文件输出目录
 */
function createDataFile(outDir) {
    let str = 'const data = {}\r\n'
    readDir(outDir).forEach(item => {
        str += `import('/${outDir}/${item}').then(res => data.${item.split('.')[0]} = res.default)\r\n`
    })
    str += 'export default data'
    fs.writeFileSync(dataDir + 'index.js', str)
}

/**
 * 生成配置文件
 * @param {string} data 配置数据
 */
function createConfigFile(data) {
    fs.writeFileSync(dataDir + 'config.js', data)
}

function readDataFile(outDir) {
    const data = {}
    readDir(outDir).forEach(item => {
        const fileData = fs.readFileSync(`${outDir}/${item}`, 'utf8')
        data[item.split('.')[0]] = JSON.parse(fileData)
    })
    return data
}

module.exports = {
    writeData,
    readDir,
    createDataFile,
    createConfigFile,
    readDataFile
}